Eesti

Praktiline juhend pärandkoodi refaktoorimiseks, mis hõlmab tuvastamist, prioritiseerimist, tehnikaid ja parimaid praktikaid moderniseerimiseks ning hooldatavuseks.

Koletise taltsutamine: Pärandkoodi refaktoorimise strateegiad

Pärandkood. Ainuüksi see termin kutsub tihti esile kujutluspilte laialivalguvatest, dokumenteerimata süsteemidest, hapratest sõltuvustest ja üleüldisest õudustundest. Paljud arendajad üle maailma seisavad silmitsi väljakutsega hooldada ja arendada neid süsteeme, mis on sageli äritegevuse seisukohast kriitilise tähtsusega. See põhjalik juhend pakub praktilisi strateegiaid pärandkoodi refaktoorimiseks, muutes frustratsiooni allika moderniseerimise ja täiustamise võimaluseks.

Mis on pärandkood?

Enne refaktoorimistehnikatesse süvenemist on oluline defineerida, mida me mõistame "pärandkoodi" all. Kuigi termin võib lihtsalt viidata vanemale koodile, keskendub nüansirikkam definitsioon selle hooldatavusele. Michael Feathers defineerib oma teedrajavas raamatus "Working Effectively with Legacy Code" pärandkoodi kui testideta koodi. Testide puudumine muudab koodi ohutu muutmise ilma regressioonide tekitamiseta keeruliseks. Siiski võib pärandkoodil olla ka teisi omadusi:

On oluline märkida, et pärandkood ei ole olemuselt halb. See esindab sageli olulist investeeringut ja kehastab väärtuslikku valdkonnateadmist. Refaktoorimise eesmärk on säilitada see väärtus, parandades samal ajal koodi hooldatavust, usaldusväärsust ja jõudlust.

Miks pärandkoodi refaktoorida?

Pärandkoodi refaktoorimine võib olla heidutav ülesanne, kuid kasu kaalub sageli väljakutsed üles. Siin on mõned peamised põhjused refaktoorimisse investeerimiseks:

Refaktoorimiskandidaatide tuvastamine

Kogu pärandkoodi ei pea refaktoorima. Oluline on prioritiseerida refaktoorimistöid järgmiste tegurite alusel:

Näide: Kujutage ette ülemaailmset logistikaettevõtet, millel on pärandsüsteem saadetiste haldamiseks. Saatmiskulude arvutamise eest vastutavat moodulit uuendatakse sageli muutuvate eeskirjade ja kütusehindade tõttu. See moodul on peamine refaktoorimiskandidaat.

Refaktoorimistehnikad

Saadaval on arvukalt refaktoorimistehnikaid, millest igaüks on mõeldud konkreetsete koodilõhnade käsitlemiseks või koodi spetsiifiliste aspektide parandamiseks. Siin on mõned levinumad tehnikad:

Meetodite komponeerimine

Need tehnikad keskenduvad suurte, keeruliste meetodite jaotamisele väiksemateks, paremini hallatavateks meetoditeks. See parandab loetavust, vähendab dubleerimist ja muudab koodi testimise lihtsamaks.

Funktsionaalsuse liigutamine objektide vahel

Need tehnikad keskenduvad klasside ja objektide disaini parandamisele, liigutades vastutusalad sinna, kuhu need kuuluvad.

Andmete organiseerimine

Need tehnikad keskenduvad andmete salvestamise ja neile juurdepääsu viisi parandamisele, muutes selle mõistmise ja muutmise lihtsamaks.

Tingimuslausete lihtsustamine

Tingimusloogika võib kiiresti keeruliseks muutuda. Nende tehnikate eesmärk on selgitada ja lihtsustada.

Meetodite väljakutsete lihtsustamine

Üldistamisega tegelemine

Need on vaid mõned näited paljudest saadaolevatest refaktoorimistehnikatest. Millist tehnikat kasutada, sõltub konkreetsest koodilõhnast ja soovitud tulemusest.

Näide: Ühe ülemaailmse panga kasutatavas Java rakenduses arvutab suur meetod intressimäärasid. Kasutades tehnikat Eralda meetod (Extract Method), et luua väiksemaid, spetsiifilisemaid meetodeid, paraneb loetavus ja intressimäärade arvutamise loogikat on lihtsam uuendada, ilma et see mõjutaks meetodi teisi osi.

Refaktoorimise protsess

Refaktoorimisele tuleks läheneda süstemaatiliselt, et minimeerida riske ja maksimeerida eduvõimalusi. Siin on soovitatav protsess:

  1. Tuvastage refaktoorimiskandidaadid: Kasutage varem mainitud kriteeriume, et tuvastada koodi osad, mis saaksid refaktoorimisest kõige rohkem kasu.
  2. Looge testid: Enne muudatuste tegemist kirjutage automaattestid, et kontrollida koodi olemasolevat käitumist. See on ülioluline tagamaks, et refaktoorimine ei tekita regressioone. Ühiktestide kirjutamiseks saab kasutada tööriistu nagu JUnit (Java), pytest (Python) või Jest (JavaScript).
  3. Refaktoorige inkrementaalselt: Tehke väikesi, järkjärgulisi muudatusi ja käivitage testid pärast iga muudatust. See teeb tekkivate vigade tuvastamise ja parandamise lihtsamaks.
  4. Tehke sagedasi commite: Tehke oma muudatused versioonihaldusesse sageli. See võimaldab teil midagi valesti minnes hõlpsasti eelmise versiooni juurde naasta.
  5. Tehke koodi ülevaatus: Laske oma koodi üle vaadata teisel arendajal. See aitab tuvastada potentsiaalseid probleeme ja tagada, et refaktoorimine on tehtud korrektselt.
  6. Jälgige jõudlust: Pärast refaktoorimist jälgige süsteemi jõudlust, et tagada, et muudatused ei ole toonud kaasa jõudluse regressioone.

Näide: Meeskond, kes refaktoorib Pythoni moodulit ülemaailmses e-kaubanduse platvormis, kasutab `pytest`'i olemasoleva funktsionaalsuse jaoks ühiktestide loomiseks. Seejärel rakendavad nad Eralda klass (Extract Class) refaktoorimist, et eraldada vastutusalad ja parandada mooduli struktuuri. Pärast iga väikest muudatust käivitavad nad testid, et tagada funktsionaalsuse püsimine muutumatuna.

Strateegiad testide lisamiseks pärandkoodile

Nagu Michael Feathers tabavalt märkis, on pärandkood testideta kood. Testide lisamine olemasolevatesse koodibaasidesse võib tunduda tohutu ettevõtmisena, kuid see on ohutu refaktoorimise jaoks hädavajalik. Siin on mitu strateegiat selle ülesande lahendamiseks:

Karakteriseerimistestid (ehk Golden Master testid)

Kui tegelete raskesti mõistetava koodiga, aitavad karakteriseerimistestid teil jäädvustada selle olemasolevat käitumist enne muudatuste tegemist. Idee on kirjutada testid, mis kinnitavad koodi praegust väljundit antud sisendite komplekti jaoks. Need testid ei pruugi kontrollida korrektsust; nad lihtsalt dokumenteerivad, mida kood *praegu* teeb.

Sammud:

  1. Tuvastage koodiüksus, mida soovite iseloomustada (nt funktsioon või meetod).
  2. Looge sisendväärtuste komplekt, mis esindab levinud ja äärmuslike stsenaariumide valikut.
  3. Käivitage kood nende sisenditega ja jäädvustage saadud väljundid.
  4. Kirjutage testid, mis kinnitavad, et kood toodab nende sisendite jaoks täpselt need väljundid.

Hoiatus: Karakteriseerimistestid võivad olla haprad, kui aluseks olev loogika on keeruline või andmetest sõltuv. Olge valmis neid uuendama, kui peate hiljem koodi käitumist muutma.

Sprout-meetod ja Sprout-klass

Need tehnikad, mida on samuti kirjeldanud Michael Feathers, püüavad lisada pärandsüsteemi uut funktsionaalsust, minimeerides samal ajal olemasoleva koodi lõhkumise riski.

Sprout-meetod: Kui teil on vaja lisada uus funktsioon, mis nõuab olemasoleva meetodi muutmist, looge uus meetod, mis sisaldab uut loogikat. Seejärel kutsuge see uus meetod välja olemasolevast meetodist. See võimaldab teil uue koodi isoleerida ja seda iseseisvalt testida.

Sprout-klass: Sarnane Sprout-meetodile, kuid klasside jaoks. Looge uus klass, mis rakendab uut funktsionaalsust, ja seejärel integreerige see olemasolevasse süsteemi.

Liivakastistamine (Sandboxing)

Liivakastistamine hõlmab pärandkoodi isoleerimist ülejäänud süsteemist, mis võimaldab teil seda kontrollitud keskkonnas testida. Seda saab teha, luues sõltuvustele libasid (mocks) või kände (stubs) või käivitades koodi virtuaalmasinas.

Mikado meetod

Mikado meetod on visuaalne probleemide lahendamise lähenemisviis keeruliste refaktoorimisülesannete lahendamiseks. See hõlmab diagrammi loomist, mis esindab koodi eri osade vahelisi sõltuvusi, ja seejärel koodi refaktoorimist viisil, mis minimeerib mõju süsteemi teistele osadele. Põhiprintsiip on muudatust "proovida" ja vaadata, mis katki läheb. Kui see läheb katki, pöörduge tagasi viimase töötava oleku juurde ja registreerige probleem. Seejärel lahendage see probleem enne algse muudatuse uuesti proovimist.

Tööriistad refaktoorimiseks

Refaktoorimisel võivad abiks olla mitmed tööriistad, mis automatiseerivad korduvaid ülesandeid ja pakuvad juhiseid parimate tavade kohta. Need tööriistad on sageli integreeritud integreeritud arenduskeskkondadesse (IDE):

Näide: Arendusmeeskond, kes töötab C# rakendusega ülemaailmse kindlustusfirma jaoks, kasutab Visual Studio sisseehitatud refaktoorimistööriistu muutujate automaatseks ümbernimetamiseks ja meetodite eraldamiseks. Samuti kasutavad nad SonarQube'i koodilõhnade ja potentsiaalsete haavatavuste tuvastamiseks.

Väljakutsed ja riskid

Pärandkoodi refaktoorimine ei ole ilma väljakutsete ja riskideta:

Parimad praktikad

Pärandkoodi refaktoorimisega seotud väljakutsete ja riskide leevendamiseks järgige neid parimaid praktikaid:

Kokkuvõte

Pärandkoodi refaktoorimine on väljakutseid pakkuv, kuid rahuldust pakkuv ettevõtmine. Järgides selles juhendis toodud strateegiaid ja parimaid praktikaid, saate koletise taltsutada ja muuta oma pärandsüsteemid hooldatavateks, usaldusväärseteks ja suure jõudlusega varadeks. Pidage meeles, et läheneksite refaktoorimisele süstemaatiliselt, testiksite sageli ja suhtleksite oma meeskonnaga tõhusalt. Hoolika planeerimise ja teostusega saate avada oma pärandkoodis peituva potentsiaali ja sillutada teed tulevasele innovatsioonile.

Koletise taltsutamine: Pärandkoodi refaktoorimise strateegiad | MLOG